package com.shujia.scala

object Demo07Func03 {
  def main(args: Array[String]): Unit = {
    // 匿名函数：没有名字的函数

    /**
     * 匿名函数的定义:
     * (参数1:参数1的类型,参数2:参数2的类型......) => { 函数体 }
     *
     */

    // String => Int
    def f1(s: String): Int = {
      s.toInt + 100
    }
    // 使用匿名函数进行简化
    //    (s: String) => {s.toInt + 100}

    def funcX(f: String => Int): Int = {
      f("321") + 200
    }

    def funcX2(f: (String, Int, String) => Int): Int = {
      f("123", 100, "321") + 200
    }

    println(funcX(f1))
    println(funcX((s: String) => {
      s.toInt + 100
    }))
    /*
    匿名函数的省略规则：
    1、return关键字可以省略，返回值类型是自动推断的，不需要指定
    2、如果代码只有一行{}可以省略
    3、如果是将匿名函数作为参数传给另一个函数时，则匿名函数的参数类型可以省略
    4、当参数只有一个时，()可以省略
    5、如果参数只被使用了一次，则可以用_替代，并且”=>“及其左边参数的定义都可以省略
     */
    println(funcX((s: String) => s.toInt + 100))
    println(funcX((s) => s.toInt + 100))
    println(funcX(s => s.toInt + 100))
    println(funcX(_.toInt + 100))

    def f2(s1: String, s2: Int, s3: String): Int = {
      s1.toInt + s2 + s3.toInt + 100
    }

    // 匿名函数也可以有名字
    val anonymousFunc: (String, Int, String) => Int = (s1: String, s2: Int, s3: String) => {s1.toInt + s2 + s3.toInt + 100}

    println(funcX2(f2)) // 844
    println(funcX2((s1: String, s2: Int, s3: String) => {
      s1.toInt + s2 + s3.toInt + 100
    }))

    println(funcX2((s1, i1, s2) => {
      s1.toInt + i1 + s2.toInt + 100
    }))
    println(funcX2(anonymousFunc))

  }

}
